package d3_polymorphism;

public class Test {
    public static void main(String[] args) {
        //目标: 搞清楚多态下的类型转化问题
        Animal a = new Animal();
        a.cry();

        //强制类型转换:可以解决多态下不能直接调用子类的问题
        Dog d1 = (Dog) a;//把a转成了狗,那么这个d1是不是就指向了dog,因为它是地址转过来的
        d1.lookDoor();

        //强转类型转换的注意事项1.只要有继承或实现关系的两个类就可以强制转换
        //编译阶段不会报错(写代码), 但是运行时可能出现强制类型转换异常

        //Cat c1 = (Cat)a; //编译不报错,运行时报错------>万一Aniaml真的是cat就会允许你强转
        //因此Java建议强制类型转换, 先判断对象的真实类型, 再进行强制类型转换
     /*   if (a instanceof Dog) {
            Dog d2 = (Dog) a;
            d2.lookDoor();
        } else if (a instanceof Cat) {-------------->是这个类型返回true 不是就返回false
            Cat c2 = (Cat) a;
            c2.catchFish();
        }*/

    }

    public static void go(Animal a){
        System.out.println("开始...");
        a.cry();
        if (a instanceof Dog) {
            Dog d2 = (Dog) a;
            d2.lookDoor();
        } else if (a instanceof Cat) {
            Cat c2 = (Cat) a;
            c2.catchFish();
        }
        System.out.println("结束...");
    }
}
